home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_09 / barbu2 / modal0.cpp < prev    next >
C/C++ Source or Header  |  1995-05-07  |  2KB  |  120 lines

  1. // MODAL0, ctor/dtor and big lines before running
  2. //////////////////////////////////////////////////////
  3. #include "MODALDLG.HPP"
  4. #include "KW.HPP"
  5. #include "CONTROLS.HPP"
  6.  
  7. MODALDLG::MODALDLG(
  8.     SHOWDATA* Guru, HWND hWndParent, HINSTANCE hInst,
  9.     const char szDescrFile[], const char szDescript[],
  10.     const char szResourceType[])
  11.     : _guru(Guru), _hP(hWndParent), _hI(hInst),
  12.     _input(hInst, szDescrFile, szResourceType),
  13.     _dsect(szDescript)
  14. {
  15. DESCRIPT Line;
  16. STR Type;
  17. _valid = SHOWDATA::DESCNOTFOUND;
  18. _pGXY = 0;
  19. _hDlg = 0;
  20. _hThinFont = 0;
  21. _nCtls = _xOffset = 0;
  22. for(int i = 0; i< CTABSIZE; i++){
  23.     _ctab[i].group = 0;
  24.     _ctab[i].ctl = 0;
  25.     }
  26. for(_input.reset(); _input.get(Line); ){
  27.     Line.type(Type);
  28.     if(Type != KW::DIALOG)
  29.         continue;
  30.     STR Var;
  31.     Line.value(KW::VAR, Var);
  32.     if(Var != _dsect)
  33.         continue;
  34.     _valid = SHOWDATA::OK;
  35.     break;
  36.     }
  37. if(SHOWDATA::OK !=_valid)
  38.     return;
  39. _dlgline = Line;
  40. if(!_initGeometry())
  41.     return;
  42.  
  43. // 0 unsed, then IDOK, IDCANCEL and tabs:
  44. _xOffset = 3 + _ng;
  45.  
  46. for(_nCtls = 0; _input.get(Line); ){
  47.     Line.type(Type);
  48.     if(Type == KW::ENDDIALOG)
  49.         break;
  50.     int added = _addCtlToDlg(Line, _xOffset + _nCtls);
  51.     _nCtls += added;
  52.     }
  53. _putTabsAndOKCAN();
  54. }
  55.  
  56. MODALDLG::~MODALDLG()
  57. {
  58. if(_pGXY != 0){
  59.     delete [] _pGXY;
  60.     _pGXY = 0;
  61.     }
  62. if(_hThinFont != 0){
  63.     DeleteObject((HGDIOBJ)_hThinFont);
  64.     _hThinFont = 0;
  65.     }
  66. for(int i = _xOffset; i < _xOffset + _nCtls; i++){
  67.     CTL *p = _ctab[i].ctl;
  68.     if(0 == p)
  69.         continue;
  70.     delete _ctab[i].ctl;
  71.     _ctab[i].ctl = 0;
  72.     for(int j = i+1; j < _xOffset + _nCtls; j++)
  73.         if(p == _ctab[j].ctl)
  74.             _ctab[j].ctl = 0;
  75.     }
  76. }
  77.  
  78. int MODALDLG::_addCtlToDlg(
  79.                     const DESCRIPT& Desc, int xCtl)
  80. {
  81. int added;
  82.  
  83. CTL *pCTL = virtualCTLCtor(Desc);
  84. if(0 == pCTL)
  85.     return 0;
  86. int nGroup = Desc.value(KW::GROUP);
  87. if(!_ng){
  88.     nGroup = 0;
  89.     }
  90. else{
  91.     if(nGroup >= _ng)
  92.         nGroup = _ng-1;
  93.     if(nGroup < 0)
  94.         nGroup = 0;
  95.     }
  96. added = pCTL->addToDlg(xCtl, &_template,
  97.         _pGXY[nGroup].duxNext,
  98.         _pGXY[nGroup].duyNext);
  99. _addToGroupGeometry(nGroup, pCTL->duW(), pCTL->duH());
  100. for(int i = 0; i < added; i++){
  101.     _ctab[xCtl+i].group = nGroup;
  102.     _ctab[xCtl+i].ctl = pCTL;
  103.     }
  104. return added;
  105. }
  106.  
  107. CTL* MODALDLG::virtualCTLCtor(const DESCRIPT& Desc)
  108. {
  109. STR Type;
  110. Desc.type(Type);
  111. if(Type == KW::EDIT)
  112.     return new CTLEDIT(Desc, _guru, this);
  113. if(Type == KW::CHECK)
  114.     return new CTLCHECK(Desc, _guru, this);
  115. if(Type == KW::RADIO)
  116.     return new CTLRADIO(Desc, _guru, this);
  117. //...
  118. return 0;
  119. }
  120.